package cn.iocoder.yudao.module.product.property.service;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.product.property.dal.dataobject.ProductPropertyValueDO;
import cn.iocoder.yudao.module.product.property.vo.AppProductPropertyValueSaveReqVO;
import cn.iocoder.yudao.module.product.property.vo.ProductPropertyValuePageReqVO;
import cn.iocoder.yudao.module.product.property.vo.ProductPropertyValueSaveReqVO;

import java.util.Collection;
import java.util.List;

/**
 * 产品 SKU值 Service 实现类
 *
 * @author LuoWenFeng
 */
public interface ProductPropertyValueService {

    /**
     * 创建规格值
     * 注意，如果已经存在该规格值，直接返回它的编号即可
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPropertyValue(ProductPropertyValueSaveReqVO createReqVO);

    /**
     * 创建规格值
     * 注意，如果已经存在该规格值，直接返回它的编号即可
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPropertyValue(AppProductPropertyValueSaveReqVO createReqVO);

    /**
     * 更新规格值
     *
     * @param updateReqVO 更新信息
     */
    void updatePropertyValue(ProductPropertyValueSaveReqVO updateReqVO);

    /**
     * 更新规格值
     *
     * @param updateReqVO 更新信息
     */
    void updatePropertyValue(AppProductPropertyValueSaveReqVO updateReqVO);

    /**
     * 获得规格值
     *
     * @param id 编号
     * @return 规格值
     */
    ProductPropertyValueDO getPropertyValue(Long id);

    /**
     * 根据规格项编号数组，获得规格值列表
     *
     * @param propertyIds 规格项目编号数组
     * @return 规格值列表
     */
    List<ProductPropertyValueDO> getPropertyValueListByPropertyIds(Collection<Long> propertyIds);

    /**
     * 根据规格项编号，活的规格值数量
     *
     * @param propertyId 规格项编号数
     * @return 规格值数量
     */
    Integer getPropertyValueCountByPropertyId(Long propertyId);

    /**
     * 获取规格值的分页
     *
     * @param pageReqVO 查询条件
     * @return 规格值的分页
     */
    PageResult<ProductPropertyValueDO> getPropertyValuePage(ProductPropertyValuePageReqVO pageReqVO);

    /**
     * 删除指定规格项编号下的规格值们
     *
     * @param propertyId 规格项的编号
     */
    void deletePropertyValuePropertyId(Long propertyId);

    /**
     * 删除指定规格项编号下的规格值们
     *
     * @param id 规格值的编号
     */
    void deletePropertyValue(Long id);

}
